<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" />
<title>Async Command Documentation</title>
<style type="text/css">

/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 6253 2010-03-02 00:24:53Z milde $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.

See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
  border: 0 }

table.borderless td, table.borderless th {
  /* Override padding for "table.docutils td" with "! important".
     The right padding separates the table cells. */
  padding: 0 0.5em 0 0 ! important }

.first {
  /* Override more specific margin styles with "! important". */
  margin-top: 0 ! important }

.last, .with-subtitle {
  margin-bottom: 0 ! important }

.hidden {
  display: none }

a.toc-backref {
  text-decoration: none ;
  color: black }

blockquote.epigraph {
  margin: 2em 5em ; }

dl.docutils dd {
  margin-bottom: 0.5em }

/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
  font-weight: bold }
*/

div.abstract {
  margin: 2em 5em }

div.abstract p.topic-title {
  font-weight: bold ;
  text-align: center }

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
  margin: 2em ;
  border: medium outset ;
  padding: 1em }

div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
  font-weight: bold ;
  font-family: sans-serif }

div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title {
  color: red ;
  font-weight: bold ;
  font-family: sans-serif }

/* Uncomment (and remove this text!) to get reduced vertical space in
   compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
  margin-bottom: 0.5em }

div.compound .compound-last, div.compound .compound-middle {
  margin-top: 0.5em }
*/

div.dedication {
  margin: 2em 5em ;
  text-align: center ;
  font-style: italic }

div.dedication p.topic-title {
  font-weight: bold ;
  font-style: normal }

div.figure {
  margin-left: 2em ;
  margin-right: 2em }

div.footer, div.header {
  clear: both;
  font-size: smaller }

div.line-block {
  display: block ;
  margin-top: 1em ;
  margin-bottom: 1em }

div.line-block div.line-block {
  margin-top: 0 ;
  margin-bottom: 0 ;
  margin-left: 1.5em }

div.sidebar {
  margin: 0 0 0.5em 1em ;
  border: medium outset ;
  padding: 1em ;
  background-color: #ffffee ;
  width: 40% ;
  float: right ;
  clear: right }

div.sidebar p.rubric {
  font-family: sans-serif ;
  font-size: medium }

div.system-messages {
  margin: 5em }

div.system-messages h1 {
  color: red }

div.system-message {
  border: medium outset ;
  padding: 1em }

div.system-message p.system-message-title {
  color: red ;
  font-weight: bold }

div.topic {
  margin: 2em }

h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  margin-top: 0.4em }

h1.title {
  text-align: center }

h2.subtitle {
  text-align: center }

hr.docutils {
  width: 75% }

img.align-left, .figure.align-left, object.align-left {
  clear: left ;
  float: left ;
  margin-right: 1em }

img.align-right, .figure.align-right, object.align-right {
  clear: right ;
  float: right ;
  margin-left: 1em }

img.align-center, .figure.align-center, object.align-center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.align-left {
  text-align: left }

.align-center {
  clear: both ;
  text-align: center }

.align-right {
  text-align: right }

/* reset inner alignment in figures */
div.align-right {
  text-align: left }

/* div.align-center * { */
/*   text-align: left } */

ol.simple, ul.simple {
  margin-bottom: 1em }

ol.arabic {
  list-style: decimal }

ol.loweralpha {
  list-style: lower-alpha }

ol.upperalpha {
  list-style: upper-alpha }

ol.lowerroman {
  list-style: lower-roman }

ol.upperroman {
  list-style: upper-roman }

p.attribution {
  text-align: right ;
  margin-left: 50% }

p.caption {
  font-style: italic }

p.credits {
  font-style: italic ;
  font-size: smaller }

p.label {
  white-space: nowrap }

p.rubric {
  font-weight: bold ;
  font-size: larger ;
  color: maroon ;
  text-align: center }

p.sidebar-title {
  font-family: sans-serif ;
  font-weight: bold ;
  font-size: larger }

p.sidebar-subtitle {
  font-family: sans-serif ;
  font-weight: bold }

p.topic-title {
  font-weight: bold }

pre.address {
  margin-bottom: 0 ;
  margin-top: 0 ;
  font: inherit }

pre.literal-block, pre.doctest-block {
  margin-left: 2em ;
  margin-right: 2em }

span.classifier {
  font-family: sans-serif ;
  font-style: oblique }

span.classifier-delimiter {
  font-family: sans-serif ;
  font-weight: bold }

span.interpreted {
  font-family: sans-serif }

span.option {
  white-space: nowrap }

span.pre {
  white-space: pre }

span.problematic {
  color: red }

span.section-subtitle {
  /* font-size relative to parent (h1..h6 element) */
  font-size: 80% }

table.citation {
  border-left: solid 1px gray;
  margin-left: 1px }

table.docinfo {
  margin: 2em 4em }

table.docutils {
  margin-top: 0.5em ;
  margin-bottom: 0.5em }

table.footnote {
  border-left: solid 1px black;
  margin-left: 1px }

table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
  padding-left: 0.5em ;
  padding-right: 0.5em ;
  vertical-align: top }

table.docutils th.field-name, table.docinfo th.docinfo-name {
  font-weight: bold ;
  text-align: left ;
  white-space: nowrap ;
  padding-left: 0 }

h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  font-size: 100% }

ul.auto-toc {
  list-style-type: none }

</style>
</head>
<body>
<div class="document" id="async-command-documentation">
<h1 class="title">Async Command Documentation</h1>

<div class="section" id="installation-and-configuration">
<h1>Installation and Configuration</h1>
<p>This module is designed to help dependent modules run complex 3rd party programs outside of Drupal on a remote server. Please read documentation of the dependent module (eg Recommender API) for more information on Installation and Configuration.</p>
<p>Conceptually, you need 2 computers: the Drupal server for your Drupal site, and the computation server for the 3rd party program. The Drupal server simply issues commands to the 3rd party program, which will be executed asynchronously on the computation server. On the Drupal server, the async_command module provides APIs to help dependent modules issue commands, display commands execution history, and so on. On the computation server, the async_command module provides a few Java libraries to help 3rd party programs access Drupal database (read data stored in Drupal, save data back into Drupal database, etc).</p>
<p>To install and config async_command, please follow these steps:</p>
<p><strong>Step 1</strong>. Install the Async Command module to your Drupal server under sites/all/modules/async_command. Then, copy the 'lib' sub-directory and async-command.jar to any folder on the computation server. If your computation server is also your Drupal server, you can leave 'lib' as-is, but be aware that the 3rd party program might consume lots of resources on your Drupal server.</p>
<p><strong>Step 2</strong>. Follow the example of config.properties.example and create a config.properties file on your computation server.</p>
<p><strong>Step 3</strong>. Follow the example of run.sh.example, and create run.sh on your computation server.</p>
<p><strong>Step 4</strong>. Make sure to read the documentation of dependent modules (eg Recommender API) for additional settings. And then you can execute &quot;run.sh&quot; to run the 3rd party program on the computation server.</p>
</div>
<div class="section" id="for-developers">
<h1>For Developers</h1>
<p>Please see examples of how to write 3rd party programs using the async_command APIs:
<a class="reference external" href="http://drupal.org/project/recommender">http://drupal.org/project/recommender</a> (written in Java)
<a class="reference external" href="http://drupal.org/project/mturk">http://drupal.org/project/mturk</a> (written in Jython)</p>
<p>For the Drupal server, you'll write a Drupal module for user interaction. You need &quot;async_command_create_command()&quot; to issue async commands. You can use the default Views to display commands execution history.</p>
<p>For the computation server, you can write 3rd party programs by extending &quot;org.drupal.project.async_command.Druplet&quot;. This class provides basic functions to read Drupal system variables, read commands stored {async_command} table, and so on. (TODO: More documentation on how to program with Async Command)</p>
<p>To use the Java libraries in languages other than Jython/JRuby/Groovy/Java, please refer to JSR 223 (<a class="reference external" href="http://download.oracle.com/javase/6/docs/technotes/guides/scripting/index.html">http://download.oracle.com/javase/6/docs/technotes/guides/scripting/index.html</a>)</p>
</div>
<div class="section" id="faq">
<h1>FAQ</h1>
<p>Q: Why is async_command different from Drush, Batch API, Queue API, or the Beanstalk module?
A: See answers on <a class="reference external" href="http://drupal.org/project/async_command">http://drupal.org/project/async_command</a>.</p>
<p>Q: How to get support?
A: Please create issues on <a class="reference external" href="http://drupal.org/project/async_command">http://drupal.org/project/async_command</a>.</p>
</div>
</div>
</body>
</html>
